import {
	buildLogger
} from './logger.js'

// 是否需要更新
export function checkUpdate({
	localVersion,
	netVersion,
	logger,
	showToast
}) {
	let result = {
		need: false, //是否需要更新
		type: 0, //更新类型：0不需要更新，1为第一位更新，即全量更新 2和3为热更新
		logger //日志记录器
	}
	if (!localVersion || !netVersion) {
		if (showToast) {
			logger.log('您已是最新版本')
		}
		return result
	}
	if ((typeof localVersion !== 'string') || (typeof netVersion !== 'string')) {
		logger.log('版本号类型不正确')
		return result
	}
	let reg = /^(\d+)\.(\d+)\.(\d+)$/
	if (!reg.test(localVersion) || !reg.test(netVersion)) {
		logger.log(`版本号格式不正确`)
		return result
	}
	let localVerInfo = localVersion.match(reg)
	let netVerInfo = netVersion.match(reg)
	// 第一位增加，则为全量更新
	// 第二和第三位增加，则为差异热更新
	if (netVerInfo[1] > localVerInfo[1]) {
		result.need = true
		result.type = 1
	} else if (netVerInfo[2] > localVerInfo[2]) {
		result.need = true
		result.type = 2
	} else if (netVerInfo[3] > localVerInfo[3]) {
		result.need = true
		result.type = 3
	} else {
		if (showToast) {
			logger.log('您已是最新版本')
		}
	}
	return result
}


// 更新大版本
function bigUpdata({
	logger,
	update_link
}) {
	// 最后情况为大版本更新
	uni.showModal({
		title: '检测到最新版本',
		content: "更新了新功能",
		confirmText: '立即更新',
		success({
			confirm,
			cancel
		}) {
			if (confirm) {
				uni.getSystemInfo({
					success(systemInfo) {
						// android为
						if (systemInfo.platform == 'android') {
							let dtask = plus.downloader.createDownload(update_link, {},
								function(d, status) {
									if (status == 200) { // 下载成功  
										let path = d.filename;
										plus.runtime.install(path); // 安装下载的apk文件
									} else { //下载失败  
										logger.log("全量更新:下载失败: " + status);
									}
								});
							dtask.start();
						} else {
							// ios为打开应用商店
							plus.runtime.openURL(apkUrl, function(res) {});
						}
					},
					fail() {
						logger.log('全量更新：获取系统息失败')
					}
				})
			}
		},
		fail() {
			logger.log('全量更新：弹框失败')
		}
	})
}
// 更新小版本

function littleUpdata({
	logger,
	update_link
}) {
	// 小版本更新
	uni.downloadFile({
		url: update_link,
		success: (downloadResult) => {
			if (downloadResult.statusCode === 200) {
				plus.runtime.install(downloadResult.tempFilePath, {
					force: false
				}, function(res) {
					plus.runtime.restart();
				}, function(e) {
					logger.log('热更新:安装失败' + JSON.stringify(e));
				});
			}
		},
		fail: (err) => {
			logger.log('热更新:下载失败')
		}
	});
}

function doUpdate({
	localVersion,
	netVersion,
	update_link,
	showToast = true
}) {
	let logger = buildLogger()
	// #ifndef APP
	logger.log('非app无需更新')
	return
	// #endif
	let updateInfo = checkUpdate({
		logger,
		localVersion,
		netVersion,
		update_link,
		showToast
	})
	if (!updateInfo.need) {
		return
	}
	if (updateInfo.type === 1) {
		bigUpdata({
			logger,
			update_link
		})
	} else {
		littleUpdata({
			logger,
			update_link
		})
	}
}

export default {
	checkUpdate,
	littleUpdata,
	bigUpdata,
	doUpdate
}